package com.yunzhong.appointment.essentialinformation.util;

import java.io.*;
import java.net.URLDecoder;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletResponse;

import com.yunzhong.appointment.util.CollectionUtil;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.springframework.web.multipart.MultipartFile;

import com.yunzhong.appointment.config.Const;

/**
 * @description 用于文件的上传和删除
 * @author 石洪刚      王仁海(为了实现富文本上传图片功能 复制一份文件 做了修改 获取物理路径网络路径上传图片)
 * @time 2017年8月21日23:26:18
 *
 */
public class FileUtils {


	/**
	 * 物理路径，网络路径
	 * 通过i/o 在物理路径创建文件， 并用网络路径指向物理路径找到文件
	 * @description 文件上传，保存在本地硬盘，返回文件请求路径
	 * @author 石洪刚
	 * @time 2017年8月21日23:28:08
	 * @param picFile
	 * @return
	 * @throws IOException
	 */
	public static String saveFile(MultipartFile picFile) throws IOException {
		//图片上传物理路径
		String location = "D:\\idea-workspace\\appointment\\src\\main\\webapp\\uploadFiles";
		String destName;
		//网络路径
		String netWorkPath = "http://localhost:8081/uploadFiles";
		if(!picFile.isEmpty()){
			//得到真实路径
			String fileName = picFile.getOriginalFilename();
			String kzm = fileName.substring(fileName.lastIndexOf("."));
			//要保存的文件名
			destName = UUID.randomUUID().toString()+kzm;
			//如果上传文件存储路径不存在则创建一个
			File s2 = new File(location);
			if (s2.exists()==false) {
				s2.mkdirs();
			}
			//文件路径
			String path = location+"\\"+destName;
			try {
				picFile.transferTo(new File(path));
				//------以上步骤物理创建完成
				//---以下网络路径指向
				netWorkPath =netWorkPath+"/"+destName;
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return netWorkPath;
	}
	/**
	 * @description 根据文件请求路径删除文件
	 * @author 石洪刚
	 * @time 2017年8月21日23:43:55
	 * @param url
	 * @param
	 */
	public static void deleteFileByUrl(String url){
		if(url!=null){
			File file = new File(url);
			if(file.exists()){
				file.delete();
			}
		}
	}

	/**
	 * @description 文件的下载
	 * @author 石洪刚
	 * @time 2017年8月21日23:47:31
	 * @param response
	 * @param location
	 * @param charCode
	 * @throws UnsupportedEncodingException
	 */
	public static void downloadFile(HttpServletResponse response,String location, String charCode) throws UnsupportedEncodingException{
		if(charCode!=null && "utf-8".equals(charCode)){
			location = URLDecoder.decode(location, "UTF-8");
		}
		//判断文件是否存在
		File s2 = new File(location);
		if (!s2.exists()) {
			return;
		}
		String fileName = location.substring( location.lastIndexOf("/")+1 );
		response.setHeader("content-type", "application/octet-stream");
		response.setContentType("application/octet-stream");
		response.setHeader("Content-Disposition", "inline;filename=" + new String(fileName.getBytes(),"ISO8859-1"));
		byte[] buff = new byte[1024];
		BufferedInputStream bis = null;
		OutputStream os = null;
		try {
			os = response.getOutputStream();
			bis = new BufferedInputStream(new FileInputStream(new File(location)));
			int i = bis.read(buff);
			while (i != -1) {
				os.write(buff, 0, buff.length);
				os.flush();
				i = bis.read(buff);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if (bis != null) {
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	/**
	 *
	 * @methodName saveXLSFile
	 * @description 将数据保存在xls文档中
	 * @author 石洪刚
	 * @time 2017年11月2日 下午2:44:14
	 * @param titles
	 * @param values
	 * @param fileName
	 * @param location
	 * @param response
	 * @throws IOException
	 */
	public static void saveXLSFile(List<String> titles, List<List<String>> values, String fileName, String location, HttpServletResponse response) throws IOException{
		//1、创建workbook，对应一个excel
		HSSFWorkbook wb = new HSSFWorkbook();
		//1.5、生成excel中可能用到的单元格样式
		//首先创建字体样式
		HSSFFont font = wb.createFont();//创建字体样式
		font.setFontName("宋体");//使用宋体
		font.setFontHeightInPoints((short) 10);//字体大小
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
		//然后创建单元格样式style
		HSSFCellStyle style1 = wb.createCellStyle();
		style1.setFont(font);//将字体注入
		style1.setWrapText(true);// 自动换行
		style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中    
		style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
		style1.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex());// 设置单元格的背景颜色
		style1.setFillPattern(CellStyle.SOLID_FOREGROUND);
		style1.setBorderTop((short) 1);// 边框的大小
		style1.setBorderBottom((short) 1);
		style1.setBorderLeft((short) 1);
		style1.setBorderRight((short) 1);

		//2、生成一个sheet，对应excel的sheet，参数为excel中sheet显示的名字
		HSSFSheet sheet = wb.createSheet(fileName);//3、设置sheet中每列的宽度，第一个参数为第几列，0为第一列；第二个参数为列的宽度，可以设置为0。//Test中有三个属性，因此这里设置三列，第0列设置宽度为0，第1~3列用以存放数据
		sheet.setColumnWidth(1, 20*256);
		sheet.setColumnWidth(2, 20*256);
		sheet.setColumnWidth(3, 20*256);//4、生成sheet中一行，从0开始
		HSSFRow row = sheet.createRow(0);
		row.setHeight((short) 800);// 设定行的高度//5、创建row中的单元格，从0开始
		//得到标题行
		for (int i = 0; i < titles.size(); i++) {
			HSSFCell cell = row.createCell(i);
			cell.setCellValue(titles.get(i));
			cell.setCellStyle(style1);
		}
		int maxLength = CollectionUtil.getMaxLengthInList(values);
		//输入数据
		for(int i=0;i<maxLength;i++){
			HSSFRow rowI = sheet.createRow(i+1);
			for(int j=0;j<values.size();j++){
				List<String> value = values.get(j);
				if(value.size()>=i){
					HSSFCell cell = rowI.createCell(j);
					cell.setCellValue(value.get(i));
				}
			}
		}

		//设置响应的头文件，会自动识别文件内容
		response.setContentType("application/vnd.ms-excel");
		response.setHeader("Content-Disposition", "attachment;filename="+fileName);
		FileOutputStream fout = new FileOutputStream(location+"/"+fileName);
		wb.write(fout);
		fout.close();
	}

}
